package main

import (
	"fmt"
	"io"
	"net"
	"os"
	stream "send_file/grpc_proto/stream"

	"google.golang.org/grpc"
	"google.golang.org/grpc/grpclog"
)

type ServiceStream struct {
	stream.UnimplementedServiceStreamServer
}

func (s ServiceStream) DownLoadFile(request *stream.Request, resp stream.ServiceStream_DownLoadFileServer) error {
	fmt.Println(request)
	// 获取要下载的文件
	file, err := os.Open("1.jpg")
	if err != nil {
		return err
	}
	defer file.Close()

	for {
		buf := make([]byte, 1024)
		_, err := file.Read(buf)
		if err == io.EOF {
			break
		}

		if err != nil {
			break
		}

		// 可以通过接口上的resp对象的Send方法不断给客户端响应
		resp.Send(&stream.FileResponse{
			Content: buf,
		})
	}
	// return 后表明本次响应结束，不会再Send
	return nil

}

func main() {
	// 监听端口
	listen, err := net.Listen("tcp", ":8080")
	if err != nil {
		grpclog.Fatalf("Failed to listen err:%v", err)
	}

	// 创建一个grpc服务器实例
	s := grpc.NewServer()
	server := ServiceStream{}

	// 将server结构体注册为grpc服务
	stream.RegisterServiceStreamServer(s, &server)
	fmt.Println("grpc server running:8080")

	// 开始处理客户端请求
	err = s.Serve(listen)
}
